package com.bear.atlassianmcp.confluence.mcp.tools;

import com.bear.atlassianmcp.confluence.model.ConfluenceSearchResult;
import com.bear.atlassianmcp.confluence.service.ConfluenceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Confluence搜索MCP工具
 * 提供内容搜索、高级搜索等功能
 */
@Service
public class ConfluenceSearchTools {

    private static final Logger logger = LoggerFactory.getLogger(ConfluenceSearchTools.class);

    private final ConfluenceService confluenceService;

    @Autowired
    public ConfluenceSearchTools(ConfluenceService confluenceService) {
        this.confluenceService = confluenceService;
    }

    /**
     * 搜索Confluence内容
     *
     * @param query 搜索查询（CQL格式）
     * @param maxResults 最大结果数，默认为50
     * @param context 工具上下文
     * @return 搜索结果的格式化文本
     */
    @Tool(description = "使用CQL（Confluence Query Language）搜索Confluence内容，支持高级搜索语法")
    public String searchContent(@ToolParam(description = "CQL查询语句，如'title ~ \"API\" AND space = DEMO'，支持文本搜索和高级条件") String query,
                               @ToolParam(required = false, description = "最大结果数，默认50") Integer maxResults,
                               ToolContext context) {
        logger.info("MCP Tool: Searching Confluence content with query: {}", query);

        try {
            ConfluenceSearchResult result = confluenceService.searchContent(query, maxResults, context);
            String formattedResult = result.toFormattedString();
            
            logger.info("Successfully searched Confluence content via MCP: {} results", result.getSize());
            return formattedResult;
            
        } catch (Exception e) {
            logger.error("Failed to search Confluence content via MCP: {}", e.getMessage());
            return "❌ 搜索内容失败。原因：" + e.getMessage();
        }
    }

    /**
     * 按文本搜索页面
     *
     * @param text 搜索文本
     * @param maxResults 最大结果数，默认为25
     * @param context 工具上下文
     * @return 搜索结果的格式化文本
     */
    @Tool(description = "按文本内容搜索Confluence页面，会在页面标题和内容中查找匹配的文本")
    public String searchByText(String text, Integer maxResults, ToolContext context) {
        logger.info("MCP Tool: Searching Confluence pages by text: {}", text);

        try {
            if (maxResults == null) {
                maxResults = 25;
            }

            // 构建CQL查询：在标题和内容中搜索文本
            String cql = String.format("type=page AND (title~\"%s\" OR text~\"%s\")", text, text);

            ConfluenceSearchResult result = confluenceService.searchContent(cql, maxResults, context);
            
            if (result.getSize() == 0) {
                return String.format("🔍 没有找到包含文本 \"%s\" 的页面。", text);
            }
            
            String formattedResult = String.format("🔍 包含文本 \"%s\" 的页面：\n%s", 
                                                  text, result.toFormattedString());
            
            logger.info("Successfully searched pages by text via MCP: {} results", result.getSize());
            return formattedResult;
            
        } catch (Exception e) {
            logger.error("Failed to search pages by text via MCP: {}", e.getMessage());
            return "❌ 文本搜索失败。原因：" + e.getMessage();
        }
    }

    /**
     * 在指定空间中搜索页面
     *
     * @param spaceKey 空间键值
     * @param text 搜索文本
     * @param maxResults 最大结果数，默认为25
     * @param context 工具上下文
     * @return 搜索结果的格式化文本
     */
    @Tool(description = "在指定Confluence空间中搜索包含特定文本的页面")
    public String searchInSpace(String spaceKey, String text, Integer maxResults, ToolContext context) {
        logger.info("MCP Tool: Searching in space {} for text: {}", spaceKey, text);

        try {
            if (maxResults == null) {
                maxResults = 25;
            }

            // 构建CQL查询：在指定空间中搜索文本
            String cql = String.format("type=page AND space=\"%s\" AND (title~\"%s\" OR text~\"%s\")",
                                     spaceKey, text, text);

            ConfluenceSearchResult result = confluenceService.searchContent(cql, maxResults, context);
            
            if (result.getSize() == 0) {
                return String.format("🔍 在空间 %s 中没有找到包含文本 \"%s\" 的页面。", spaceKey, text);
            }
            
            String formattedResult = String.format("🔍 空间 %s 中包含文本 \"%s\" 的页面：\n%s", 
                                                  spaceKey, text, result.toFormattedString());
            
            logger.info("Successfully searched in space {} via MCP: {} results", spaceKey, result.getSize());
            return formattedResult;
            
        } catch (Exception e) {
            logger.error("Failed to search in space {} via MCP: {}", spaceKey, e.getMessage());
            return "❌ 空间搜索失败。原因：" + e.getMessage();
        }
    }

    /**
     * 搜索最近更新的页面
     * 
     * @param days 天数，搜索最近N天更新的页面
     * @param maxResults 最大结果数，默认为25
     * @return 搜索结果的格式化文本
     */
    @Tool(description = "搜索最近N天内更新的Confluence页面")
    public String searchRecentPages(@ToolParam(required = false, description = "天数，搜索最近N天更新的页面，默认7天") Integer days,
                                   @ToolParam(required = false, description = "最大结果数，默认25") Integer maxResults,
                                   ToolContext toolContext) {
        logger.info("MCP Tool: Searching recent pages updated in last {} days", days);
        
        try {
            if (days == null) {
                days = 7; // 默认搜索最近7天
            }
            if (maxResults == null) {
                maxResults = 25;
            }
            
            // 构建CQL查询：搜索最近更新的页面
            String cql = String.format("type=page AND lastModified >= -%dd ORDER BY lastModified DESC", days);
            
            ConfluenceSearchResult result = confluenceService.searchContent(cql, maxResults, toolContext);
            
            if (result.getSize() == 0) {
                return String.format("🔍 最近 %d 天内没有更新的页面。", days);
            }
            
            String formattedResult = String.format("🔍 最近 %d 天内更新的页面：\n%s", 
                                                  days, result.toFormattedString());
            
            logger.info("Successfully searched recent pages via MCP: {} results", result.getSize());
            return formattedResult;
            
        } catch (Exception e) {
            logger.error("Failed to search recent pages via MCP: {}", e.getMessage());
            return "❌ 搜索最近页面失败。原因：" + e.getMessage();
        }
    }
}
